package com.example.blog.util;

import org.springframework.util.DigestUtils;
import org.springframework.util.StringUtils;

import java.util.UUID;

/**
 *  加盐加密: 盐 + md5.
 */
public class PasswordUtils {

    /**
     * 1. 加盐并生成密码
     *
     * @param password 用户明文密码
     * @return 保存到数据库的密码.
     */
    public static String encrypt(String password) {
        // a. 产生32位的盐
        String salt = UUID.randomUUID().toString().replace("-", "");
        // b. 生成产生盐之后的密码
        String saltPassword = DigestUtils.md5DigestAsHex((salt + password).getBytes());
        // c. 生成最终密码(保存到数据库的密码): 16+$+盐+$+16.
        return saltPassword.substring(0, 16) + "$" +
                salt + "$" + saltPassword.substring(16);
    }

    /**
     *  1. 加盐并生成密码, 是方法1 的重载.
     *  (用于判定密码是否正确)
     *
     * @param password 明文密码
     * @param salt 盐
     * @return 与数据库中保存的密码比较
     */
    public static String encrypt(String password, String salt) {
        // a. 生成产生盐之后的密码
        String saltPassword = DigestUtils.md5DigestAsHex((salt + password).getBytes());
        // b. 生成最终密码(数据库中保存的密码比较): 16+$+盐+$+16.
        return saltPassword.substring(0, 16) + "$" +
                salt + "$" + saltPassword.substring(16);
    }

    /**
     * 3. 验证密码是否正确.
     *
     * @param inputPassword 用户输入的铭文密码
     * @param finalPassword 数据库中的密码
     * @return true: 密码正确.  false: 密码错误.
     */
    public static boolean check(String inputPassword, String finalPassword) {
        if (StringUtils.hasLength(inputPassword) && StringUtils.hasLength(finalPassword)
                                                && finalPassword.length() == 66) {
            // 1. 拿到 盐
            // System.out.println(Arrays.toString(finalPassword.split("\\$")));
            String salt = finalPassword.split("\\$")[1];
            // System.out.println(salt);
            // 2. 使用之前加密的步骤将 铭文密码和盐 进行加密, 得到待验证密码.
            String confirmPassword = PasswordUtils.encrypt(inputPassword, salt);
//            System.out.println("----------------------------------------");
//            System.out.println("salt: " + salt);
//            System.out.println("confirmPassword: " + confirmPassword);
//            System.out.println("--------------------------------------------");
            // 3. 验证密码
            return finalPassword.equals(confirmPassword);
        }
        return false;
    }

}
